#include "client.h"

int connexion_client(const char* machine, const char * port){
  struct addrinfo hints;
  struct addrinfo * result, * rp;
  int res, bon, s;

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;

  res = getaddrinfo(machine , port, &hints, &result);
  if(res != 0)
    {
      fprintf(stderr, "getaddinfo:%s\n",gai_strerror(res));
      exit(1);
    }

  bon = 0;
  for( rp = result; rp != NULL; rp = rp->ai_next){
    s = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol);
    if( s == -1) 
      {
	fprintf(stderr, "Création de la socket impossible\n");
	continue;
      }
    res = connect(s , rp->ai_addr, rp->ai_addrlen);
    if (res == 0)
      {
	bon = 1;
	break;
      }
    fprintf(stderr, "Impossible de réserver l'adresse\n");
    close(s);
  }
  freeaddrinfo(result);
  if (bon == 0)
    {
    fprintf(stderr, "Impossible d'obtenir une adresse\n");
    exit(-1);
    }

  return s;
}

void changer_Utilisateur(char **utilisateur, int socket)
{
  size_t tailleBuf;
  int tailleSend = 0;
  int ret;
  char tmp[128];
  char *tmp2 = NULL;
  char *tmp3 = NULL;
  char continu = 1;
  printf("Veuillez saisir le nom d'utilisateur : ");
  fflush(stdout);
  do
    {
      tmp3 = fgets(tmp, 127, stdin);
        
    if(!tmp3 && errno == EINTR)
	{
	  perror("fgets");
	  clearerr(stdin);
	  return;
	}
      if(tmp3 != NULL)
	{
	  char * lf = strchr(tmp, '\n');
	  if (lf != NULL)
	    {
	      *lf = '\0';
	      continu = 0;
	    }
	    {
	      if(tmp2 != NULL)
		{
		  tmp3 = (char *) malloc((1 + strlen(tmp) + strlen(tmp2))
					 *sizeof(char));
		  tmp3 = strncpy(tmp3, tmp2, strlen(tmp2) + 1);
		  tmp3 = strcat(tmp3, tmp);
		  free(tmp2);
		  tmp2 = tmp3;
		  tmp3 = NULL;
		}
	      else
		{
		  tmp2 = (char *) malloc((1+strlen(tmp))*sizeof(char));
		  tmp2 = strncpy(tmp2, tmp, 1+strlen(tmp));
		}
	    }
	}
    }while(continu == 1 && VARSIGNAL);
  if(!VARSIGNAL)
    return;
  (*utilisateur) = tmp2;
  tailleBuf = strlen((*utilisateur)) + 1;
  printf("Utilisateur : %s\n", (*utilisateur));
  if(send(socket, &tailleBuf, sizeof(size_t), 0) == -1)
    {
      if(errno != ENOBUFS)
	{
	  perror("Erreur send");
	  exit(1);
	}
    }
  do
    {
      ret = send(socket, &((*utilisateur)[tailleSend]), (tailleBuf - tailleSend) * sizeof(char), 0);
      if(ret == -1)
	{
	  if(errno != ENOBUFS)
	    {
	      perror("Erreur send");
	      exit(1);
	    }
	}
      tailleSend += ret;
    }while(tailleSend < tailleBuf);
}

void menu_Client(int socket){
  char choix = 'S';
  char continu = 1;
  const char *menu="Menu :\nRecevoir : R\nEnvoyer : E\nChanger d'utilisateur : C\nSortir : S\n";
  char *utilisateur = NULL;
  printf("Synchronisation de l'utilisateur\n");
  changer_Utilisateur(&utilisateur, socket);
  printf("%s\n" , utilisateur);
  while(continu && VARSIGNAL)
    {
      printf("%s", menu);
      choix = getc(stdin);
      (void)getc(stdin);
      if(send(socket, &choix, sizeof(char), 0) == -1)
	{
	  if(errno == ENOBUFS)
	    break;
	  perror("Erreur send");
	  exit(1);
	}
      switch(choix)
	{
	case 'R':
	  recevoir_Rapport(socket, utilisateur);
	  break;
	case 'E':
	  envoyer_Rapport(socket, utilisateur);
	  break;
	case 'C':
	  changer_Utilisateur(&utilisateur, socket);
	  break;
	case 'S':
	  continu = 0;
	  break;
	default:
	  break;
	}
    }
  printf("Bye\n");
  free(utilisateur);
}


